package cn.com.softvan.easycode;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import cn.com.softvan.common.IOHelper;
import cn.com.softvan.common.StrUtils;
import cn.com.softvan.common.Validator;
import cn.com.softvan.easycode.bean.ConfigBean;
import cn.com.softvan.easycode.utils.ActionUtils;
import cn.com.softvan.easycode.utils.BeanUtils;
import cn.com.softvan.easycode.utils.ConfigJsonAndDbColumsUtils;
import cn.com.softvan.easycode.utils.DaoInterUtils;
import cn.com.softvan.easycode.utils.EntityUtils;
import cn.com.softvan.easycode.utils.JspUtils;
import cn.com.softvan.easycode.utils.MybatisUtils;
import cn.com.softvan.easycode.utils.ServiceImplUtils;
import cn.com.softvan.easycode.utils.ServiceInterUtils;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String fileurl=Main.class.getResource("/").getPath()+"config.txt";
		try {
//			System.out.println(fileurl);
			List<ConfigBean> configBeans=ConfigJsonAndDbColumsUtils.getConfigBeans(fileurl);
			
			if(configBeans!=null){
				//--根目录--
				String dirUrl="";
				//----各种配置文件的集合----
//				StringBuffer sb=new StringBuffer();
				for(int i=0;i<configBeans.size();i++){
					
					//包名
					String package_name="";
					//存放 当前模块 mybatis模块配置信息 bean class ; entity class ; mybatis xml
					StringBuffer mybatis_bean_entity_xml_sb=new StringBuffer();
					//存放 spring dao service 模块配置信息
					StringBuffer spring_dao_service_xml_sb=new StringBuffer();
					//存放 spring action 模块配置信息
					StringBuffer spring_action_xml_sb=new StringBuffer();
					//存放 struts xml 模块配置信息
					StringBuffer struts_xml_sb=new StringBuffer();
					ConfigBean config=configBeans.get(i);
//					if(i==0){
						dirUrl=config.getResourcesDirUrl();
//					}
					if(Validator.notEmpty(config.getThisJspDir())){
						package_name=StrUtils.replaceAll(config.getThisJspDir(),"\\.","-");
					}else{
						package_name=config.getActionPackage().substring(config.getActionPackage().lastIndexOf(".")+1,config.getActionPackage().length());
					}
					
					
					//TODO============mybatis 配置===begin==============
					if("1".equals(config.getIsMybatisXml())){
						mybatis_bean_entity_xml_sb.append(getXmlHeader(1));
						mybatis_bean_entity_xml_sb.append("\n\t\t<!--==="+config.getPackageInfo()+"==begin=== -->");
						mybatis_bean_entity_xml_sb.append("\n\t\t<!--bean class-->");
	//					mybatis_bean_entity_xml_sb.append("\n\t\t");
						mybatis_bean_entity_xml_sb.append(BeanUtils.toFile(config));
						mybatis_bean_entity_xml_sb.append("\n\t\t<!--entity class -->");
	//					mybatis_bean_entity_xml_sb.append("\n\t\t");
						mybatis_bean_entity_xml_sb.append(EntityUtils.toFile(config));
						mybatis_bean_entity_xml_sb.append("\n\t\t<!--==="+config.getPackageInfo()+"==end=== -->");
						mybatis_bean_entity_xml_sb.append("\n\t\t");
						mybatis_bean_entity_xml_sb.append("\n\t</typeAliases>	");
						mybatis_bean_entity_xml_sb.append("\n\t<!-- 插件 -->	");
						mybatis_bean_entity_xml_sb.append("\n\t<plugins>	");
						mybatis_bean_entity_xml_sb.append("\n\t\t<plugin interceptor=\"cn.com.softvan.dao.plugins.PagePlugin\">	");
						mybatis_bean_entity_xml_sb.append("\n\t\t\t<property name=\"dialect\" value=\"mysql\" />	");
						mybatis_bean_entity_xml_sb.append("\n\t\t\t<property name=\"pageSqlId\" value=\".*IsPage.*\" />	");
						mybatis_bean_entity_xml_sb.append("\n\t\t</plugin>	");
						mybatis_bean_entity_xml_sb.append("\n\t</plugins>	");
						mybatis_bean_entity_xml_sb.append("\n\t<!-- xxx -->	");
						mybatis_bean_entity_xml_sb.append("\n\t<mappers>	");
						mybatis_bean_entity_xml_sb.append("\n\t\t<!--==="+config.getPackageInfo()+"==begin=== -->");
	//					mybatis_bean_entity_xml_sb.append("\n\t\t");
						mybatis_bean_entity_xml_sb.append(MybatisUtils.toFile(config));
						mybatis_bean_entity_xml_sb.append("\n\t\t<!--==="+config.getPackageInfo()+"==end=== -->");
						mybatis_bean_entity_xml_sb.append("\n\t</mappers>");
						mybatis_bean_entity_xml_sb.append("\n</configuration>");
					}
					//TODO============mybatis 配置====end==============
					
					
					//TODO============Spring dao service 配置====begin==============
					if("1".equals(config.getIsDaoInter())){
						spring_dao_service_xml_sb.append(getXmlHeader(2));
						spring_dao_service_xml_sb.append("\n\t");
						spring_dao_service_xml_sb.append("\n\t<!--==="+config.getPackageInfo()+"=dao=begin=== -->");
	//					spring_dao_service_xml_sb.append("\n\t\t");
						spring_dao_service_xml_sb.append(DaoInterUtils.toFile(config));
						spring_dao_service_xml_sb.append("\n\t<!--==="+config.getPackageInfo()+"=dao=end=== -->");
						spring_dao_service_xml_sb.append("\n\t");
	//					spring_dao_service_xml_sb.append("\n\t\t<!-- service class interface-->");
	//					spring_dao_service_xml_sb.append("\n\t\t");
						ServiceInterUtils.toFile(config);
						spring_dao_service_xml_sb.append("\n\t<!--==="+config.getPackageInfo()+"=service=begin=== -->");
	//					spring_dao_service_xml_sb.append("\n\t\t");
						spring_dao_service_xml_sb.append(ServiceImplUtils.toFile(config));
						spring_dao_service_xml_sb.append("\n\t<!--==="+config.getPackageInfo()+"=service=end=== -->");
						spring_dao_service_xml_sb.append("\n</beans>");
						}
						//TODO============Spring dao service 配置====end==============
						
						//TODO============Spring action 配置====begin==============
						StringBuffer authSql=new StringBuffer();
						if("1".equals(config.getIsAction())){
						spring_action_xml_sb.append(getXmlHeader(3));
						spring_action_xml_sb.append("\n\t");
						spring_action_xml_sb.append("\n\t<!--==="+config.getPackageInfo()+"=action=begin=== -->");
	//					spring_action_xml_sb.append("\n\t\t");
						authSql.append("\n\n--");
						spring_action_xml_sb.append(ActionUtils.toFile(config,authSql));
						spring_action_xml_sb.append("\n\t<!--==="+config.getPackageInfo()+"=action=end=== -->");
						spring_action_xml_sb.append("\n\t");
						spring_action_xml_sb.append("\n</beans>");
						
						//文件保存路径 项目根目录+包路径+类名称
						String file_packe_url=config.getWebAppDir()+"/WEB-INF/pages/admin/"+package_name+"/";
						//创建文件夹
						IOHelper.MkDir(file_packe_url);
						//写入文件
						IOHelper.saveFile(file_packe_url+"/authSql.sql", authSql.toString() );
						
					}
					//TODO============Spring action 配置====end==============
					
					//TODO============JSP页面 配置====begin==============
					if("1".equals(config.getIsJsp())){
						struts_xml_sb.append(getXmlHeader(4));
						struts_xml_sb.append("\n\t<package name=\""+package_name+"\"");
						if(Validator.notEmpty(config.getStrutsNamespace())){
							struts_xml_sb.append(" namespace=\""+config.getStrutsNamespace()+"\"");
						}
						if(Validator.notEmpty(config.getStrutsXmlExtends())){
							struts_xml_sb.append(" extends=\""+config.getStrutsXmlExtends()+"\"");
						}
						struts_xml_sb.append(" >");
						if(Validator.notEmpty(config.getStrutsDefaultInterceptor())){
							struts_xml_sb.append("\n\t\t<default-interceptor-ref name=\""+config.getStrutsDefaultInterceptor()+"\" /> ");
						}
						//--包菜单--
						List<String> leftMenuList=new ArrayList<String>();
						Map<String,String> leftMap=new TreeMap<String,String>();
						struts_xml_sb.append(JspUtils.toFile(config,leftMenuList,leftMap));
						struts_xml_sb.append("\n\t</package>");
						struts_xml_sb.append("\n</struts>");
						try {
							String file_packe_url="c:/easycode";
							IOHelper.MkDir(file_packe_url);
							//--文件
							JspUtils.savePropertiesFile( file_packe_url+"/"+"public", leftMap, "zh_CN" ,true);//中文 -- 大陆
							JspUtils.savePropertiesFile( file_packe_url+"/"+"public", leftMap, "en_US" ,true);//英文 -- 美国
							
							
							StringBuffer leftMenu=new StringBuffer();
							leftMenu.append("\n\t\t<li id=\""+config.getThisJspDir()+"\" class=\"\">");
							leftMenu.append("\n\t\t\t<a class=\"active\" href=\"javascript:;\">");
							leftMenu.append("\n\t\t\t<i class=\"fa fa-cogs\"></i> ");
							leftMenu.append("\n\t\t\t<span class=\"title\">"+config.getPackageInfo()+"</span>");
							leftMenu.append("\n\t\t\t<span id=\""+config.getThisJspDir()+"_arrow\" class=\"arrow\"></span>");
							leftMenu.append("\n\t\t\t</a>");
							leftMenu.append("\n\t\t\t<ul id=\""+config.getThisJspDir()+"_sub_menu\" style=\"display: none;\" class=\"sub-menu\">");
							for(String menu:leftMenuList){
								leftMenu.append(menu);
							}
							leftMenu.append("\n\t\t\t</ul>");
							leftMenu.append("\n\t\t</li>");
							//文件保存路径 项目根目录+包路径+类名称
							file_packe_url=config.getWebAppDir()+"/WEB-INF/pages/admin/"+package_name+"/";
							//创建文件夹
							IOHelper.MkDir(file_packe_url);
							//写入文件
							IOHelper.saveFile(file_packe_url+"/menu_left.txt", leftMenu.toString() );
						} catch (Exception e1) {
						}
					}
					//TODO============JSP页面 配置====end==============
					try {
						if("1".equals(config.getIsMybatisXml())){
							//写入文件 mybatis 
							String mybatis_fileurl=dirUrl+"config/mybatis";
							IOHelper.MkDir(mybatis_fileurl);
							IOHelper.saveFile(mybatis_fileurl+"/mybatis-config-"+package_name+".xml", mybatis_bean_entity_xml_sb.toString() );
						}
						//写入文件 spring_ dao service 
						if("1".equals(config.getIsDaoInter())||"1".equals(config.getIsAction())||"1".equals(config.getIsService())){
							String spring_fileurl=dirUrl+"config/spring";
							IOHelper.MkDir(spring_fileurl);
							IOHelper.saveFile(spring_fileurl+"/applicationContext-"+package_name+".xml", spring_dao_service_xml_sb.toString() );
							//写入文件 spring_ action
							IOHelper.saveFile(spring_fileurl+"/applicationContext-action-admin-"+package_name+".xml", spring_action_xml_sb.toString() );
						}
						if("1".equals(config.getIsStrutsXml())){
							//写入文件 struts_ 
							String struts_fileurl=dirUrl+"config/struts";
							IOHelper.MkDir(struts_fileurl);
							IOHelper.saveFile( struts_fileurl+"/struts-admin-"+package_name+".xml", struts_xml_sb.toString() );
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("==============执行完毕==========执行完毕=============end=======执行完毕===========执行完毕====================");
	}
	/**
	 * 获取xml文件头
	 * @param type 1=mybatis 2 spring dao service 3 action 4 struts
	 * @return
	 */
	private static StringBuffer getXmlHeader(int type){
		StringBuffer sb=new StringBuffer();
		switch (type) {
		case 1:{
			sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>	");
			sb.append("\n<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"	");
			sb.append("\n\t\"http://mybatis.org/dtd/mybatis-3-config.dtd\">	");
			sb.append("\n<configuration>	");
			sb.append("\n\t<settings>	");
			sb.append("\n\t\t<!-- 这个配置使全局的映射器启用或禁用缓存 -->	");
			sb.append("\n\t\t<setting name=\"cacheEnabled\" value=\"true\" />	");
			sb.append("\n\t\t<!-- 全局启用或禁用延迟加载。当禁用时，所有关联对象都会即时加载 -->	");
			sb.append("\n\t\t<setting name=\"lazyLoadingEnabled\" value=\"true\" />	");
			sb.append("\n\t\t<!-- 当启用时，有延迟加载属性的对象在被调用时将会完全加载任意属性。否则，每种属性将会按需要加载 -->	");
			sb.append("\n\t\t<setting name=\"aggressiveLazyLoading\" value=\"false\" />	");
			sb.append("\n\t\t<!-- 允许或不允许多种结果集从一个单独的语句中返回（需要适合的驱动） -->	");
			sb.append("\n\t\t<setting name=\"multipleResultSetsEnabled\" value=\"true\" />	");
			sb.append("\n\t\t<!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->	");
			sb.append("\n\t\t<setting name=\"useColumnLabel\" value=\"true\" />	");
			sb.append("\n\t\t<!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用，尽管一些驱动拒绝兼容但仍然有效（比如Derby） -->	");
			sb.append("\n\t\t<setting name=\"useGeneratedKeys\" value=\"true\" />	");
			sb.append("\n\t\t<!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单，没有嵌套的结果。FULL会自动映射任意复杂的结果（嵌套的或其他情况） -->	");
			sb.append("\n\t\t<setting name=\"autoMappingBehavior\" value=\"FULL\" />	");
			sb.append("\n\t\t<!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 -->	");
			sb.append("\n\t\t<setting name=\"defaultExecutorType\" value=\"REUSE\" />	");
			sb.append("\n\t\t<!-- 设置超时时间，它决定驱动等待一个数据库响应的时间 -->	");
			sb.append("\n\t\t<setting name=\"defaultStatementTimeout\" value=\"25000\" />	");
			sb.append("\n\t</settings>	");
			sb.append("\n\t<typeAliases>	");
			} 
			break;
		case 2:{
			sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>	");
			sb.append("\n<beans xmlns=\"http://www.springframework.org/schema/beans\"	");
			sb.append("\n\t\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"	");
			sb.append("\n\t\txmlns:context=\"http://www.springframework.org/schema/context\"	");
			sb.append("\n\t\txmlns:aop=\"http://www.springframework.org/schema/aop\"	");
			sb.append("\n\t\txmlns:tx=\"http://www.springframework.org/schema/tx\"	");
			sb.append("\n\t\txmlns:jee=\"http://www.springframework.org/schema/jee\"	");
			sb.append("\n\t\txsi:schemaLocation=\"http://www.springframework.org/schema/beans 	");
			sb.append("\n\t\thttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd	");
			sb.append("\n\t\thttp://www.springframework.org/schema/context 	");
			sb.append("\n\t\thttp://www.springframework.org/schema/context/spring-context-4.0.xsd	");
			sb.append("\n\t\thttp://www.springframework.org/schema/tx 	");
			sb.append("\n\t\thttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd	");
			sb.append("\n\t\thttp://www.springframework.org/schema/aop 	");
			sb.append("\n\t\thttp://www.springframework.org/schema/aop/spring-aop-4.0.xsd	");
			sb.append("\n\t\thttp://www.springframework.org/schema/jee 	");
			sb.append("\n\t\thttp://www.springframework.org/schema/jee/spring-jee-4.0.xsd\">	");

			}
			break;
		case 3:{
			sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>	");
			sb.append("\n<beans xmlns=\"http://www.springframework.org/schema/beans\"	");
			sb.append("\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:aop=\"http://www.springframework.org/schema/aop\"	");
			sb.append("\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"	");
			sb.append("\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans	");
			sb.append("\n\thttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd	");
			sb.append("\n\thttp://www.springframework.org/schema/tx	");
			sb.append("\n\thttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd	");
			sb.append("\n\thttp://www.springframework.org/schema/aop	");
			sb.append("\n\thttp://www.springframework.org/schema/aop/spring-aop-4.0.xsd	");
			sb.append("\n\thttp://www.springframework.org/schema/context	");
			sb.append("\n\thttp://www.springframework.org/schema/context/spring-context-4.0.xsd\">	");
			sb.append("\n\t<!-- ************************ACTION类************************************* -->	");

			}
			break;
		case 4:{
			sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
			sb.append("\n<!DOCTYPE struts PUBLIC");
			sb.append("\n\t\"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN\"");
			sb.append("\n\t\"http://struts.apache.org/dtds/struts-2.1.7.dtd\">");
			sb.append("\n<struts>");
			}
			break;
		default:
			break;
		}
		return sb;
	}
	
}
